'''
闭包

什么是闭包？

在 Python 中，闭包是指一个嵌套函数，它可以访问并操作其外部函数的局部变量，
即使外部函数已经执行完毕。换句话说，闭包是一个函数对象，它不仅包含了函数本身，
还保存了定义该函数时的环境（即外部函数的作用域）。

闭包的主要作用如下：
1，数据封装与隐藏：闭包可以将数据封装在其内部，外部无法直接访问这些数据，只有通过闭包提供的接口才能操作。
这有助于保护数据，避免外部代码意外修改。

2，状态保存：闭包可以记住其外部函数的局部变量的状态，即使外部函数已经执行完毕。
每次调用闭包时，这些变量的状态都会被保留，使得闭包可以根据之前的状态继续执行。

3，实现函数工厂：闭包可以根据不同的参数生成不同的函数，实现函数的动态生成。
'''


# 数据的封装和影藏
def counter():
    count = 0 # 局部变量，这个被保护起来了，只能通过 increment() 访问
    def increment():
        nonlocal count
        count += 1
        return count
    return increment

# 创建一个计数器实例
c = counter()
print(c())  # 输出 1
print(c())  # 输出 2
print(c())  # 输出 2
print(c())  # 输出 2


def accumulator():
    total = 0 # 局部变量
    def add(num):
        nonlocal total # 声明total是外部函数的局部变量
        total += num
        return total
    return add

# 创建一个累加器实例
acc = accumulator()
print(acc(1))  # 输出 1
print(acc(2))  # 输出 3
print(acc(3))  # 输出 6

# total 的值为什么能保持上一次的计算结果？
# 因为 total 是累加器的局部变量，它被累加器函数引用，
# 而累加器函数又被累加器函数引用，
# 所以累加器函数的引用计数永远不会为 0，
# 所以 total 的值不会被垃圾回收机制回收。





def multiplier(factor):
    def multiply(num):
        return num * factor
    return multiply



def controller():
    def increment(num):
        return num + 1

    def decrement(num):
        return num - 1
    return increment, decrement


def controller2():
    def __increment(num):
        return num + 1
    def __decrement(num):
        return num - 1

    def inc(num):
        return __increment(num)

    def dec(num):
        return __decrement(num)

    return inc, dec









# 创建一个乘以 2 的乘法器
double = multiplier(2)
print(double(5))  # 输出 10

# 创建一个乘以 3 的乘法器
triple = multiplier(3)
print(triple(5))  # 输出 15

con = controller()
print(con[0](5))
print(con[1](5))

con2 = controller2()
print(con2[0](5))
print(con2[1](5))

con3 = controller2()
print(con3[0](5))
print(con3[1](5))